package screen

import (
	"fmt"
	"gexcel/pkg/excel"
)

func NewExcelScreen(excel *excel.Excel) *Screen {
	s := NewScreen()
	s.SheetDataLineNumberWidth = 3
	s.ExcelObj = excel
	s.SheetList = s.ExcelObj.GetSheetList()
	s.PageCur = PageSheetChoice
	s.EventRegister("Esc", func() {
		if s.BtnLast != "Esc" {
			s.LogInfo("Esc 按下，再按一下退出！")
		} else {
			s.Exit()
		}
	})

	s.EventRegister("Rune[h]", func() {
		s.LogInfo("[h] Help: Press ESC twice to exit, C to clear. ───")
	})
	s.EventRegister("Rune[g]", func() {
		if s.PageCur == PageSheetData {
			if s.BtnLast != "Rune[g]" {
				s.LogInfo("g 按下，再按一下返回第一行！")
			} else {
				s.SheetCellCurY = 0
				s.UpdateScreenCur()
				s.UpdateSheetDataLineNumberWidth()
				s.LogInfo("已返回第一行！")
			}
		}
	})
	s.EventRegister("Rune[G]", func() {
		if s.PageCur == PageSheetData {
			if s.BtnLast != "Rune[G]" {
				s.LogInfo("G 按下，再按一下返回最后一行！")
			} else {
				s.SheetCellCurY = len(s.SheetData) - 1
				s.UpdateScreenCur()
				s.UpdateSheetDataLineNumberWidth()
				s.LogInfo("已到达最后一行！")
			}
		}
	})
	s.EventRegister("Rune[t]", func() {
		s.PageCur = PageSheetChoice
		s.LogInfo("[t] Sheet Choice")
	})
	s.EventRegister("Rune[d]", func() {
		s.PageCur = PageSheetData
		s.LogInfo("[d] Sheet Data")
	})
	s.EventRegister("Rune[e]", func() {
		if s.PageCur == PageSheetData {
			s.LogInfo("[e] Edit Cell Data 具体功能暂未实现")
			//s.PageCur = PageSheetDataEdit
			//if str, err := common.EditString("lalala"); err != nil {
			//	s.LogError(err.Error())
			//} else {
			//	s.LogInfo("edit: " + str)
			//}
			//s.PageCur = PageSheetData
			//s.Refresh()
		}
	})
	s.EventRegister("Right", func() {
		s.LogInfo("上下左右：右")
		if s.PageCur == PageSheetData {
			s.SheetCellCurX++
			if s.SheetCellCurX >= len(s.SheetCellWidth) {
				s.SheetCellCurX = len(s.SheetCellWidth) - 1
			}
			s.UpdateScreenCur()
		}
	})
	s.EventRegister("Left", func() {
		s.LogInfo("上下左右：左")
		if s.PageCur == PageSheetData {
			s.SheetCellCurX--
			if s.SheetCellCurX < 0 {
				s.SheetCellCurX = 0
				s.SheetDataStartPointX = 0
			}
			s.UpdateScreenCur()
		}
	})
	s.EventRegister("Up", func() {
		s.LogInfo("上下左右：上")
		if s.PageCur == PageSheetChoice {
			s.SheetCur -= 1
			if s.SheetCur < 0 {
				s.SheetCur = len(s.SheetList) - 1
			}
			s.LogInfo(fmt.Sprintf("切换到新的页面:[%v]-[%v] (回车后确认)", s.SheetCur, s.SheetList[s.SheetCur]))
			s.ShowSheetChoice()
		} else if s.PageCur == PageSheetData {
			s.SheetCellCurY--
			if s.SheetCellCurY < 0 {
				s.SheetCellCurY = 0
			}
			s.UpdateScreenCur()
			s.UpdateSheetDataLineNumberWidth()
		}
	})
	s.EventRegister("Down", func() {
		s.LogInfo("上下左右：下")
		if s.PageCur == PageSheetChoice {
			s.SheetCur += 1
			if s.SheetCur >= len(s.SheetList) {
				s.SheetCur = 0
			}
			s.LogInfo(fmt.Sprintf("切换到新的页面:[%v]-[%v] (回车后确认)", s.SheetCur, s.SheetList[s.SheetCur]))
			s.ShowSheetChoice()
		} else if s.PageCur == PageSheetData {
			if s.SheetCellCurY >= len(s.SheetData)-1 {
				s.LogWarn("数据已经到底！")
			} else {
				s.SheetCellCurY++
			}
			s.UpdateScreenCur()
			s.UpdateSheetDataLineNumberWidth()
		}
	})
	s.EventRegister("Enter", func() {
		if s.PageCur == PageSheetChoice {
			s.PageCur = PageSheetData
			s.LoadSheetData()
		}
	})
	s.EventRegister("Ctrl+R", func() {
		s.LogInfo("Ctrl+R 按下")
		if s.PageCur == PageSheetData {
			s.LogInfo("Ctrl+R 按下 -- 刷新页面")
			s.Refresh()
		}
	})
	s.EventRegister("Ctrl+P", func() {
		s.LogInfo("Ctrl+P 按下")
		if s.PageCur == PageSheetData {
			s.LogInfo("Ctrl+P 按下 -- 增加宽度 +10")
			s.SheetCellWidth[s.SheetCellCurX] += 10
		}
	})
	s.EventRegister("Ctrl+O", func() {
		s.LogInfo("Ctrl+O 按下")
		if s.PageCur == PageSheetData {
			s.LogInfo("Ctrl+O 按下 -- 减少宽度 -10 (最小10)")
			s.SheetCellWidth[s.SheetCellCurX] -= 10
			if s.SheetCellWidth[s.SheetCellCurX] < 10 {
				s.SheetCellWidth[s.SheetCellCurX] = 10
			}
		}
	})
	s.EventRegister("Rune[d]", func() {
		s.LogInfo("d 按下")
		if s.PageCur == PageSheetData {
			s.LogInfo("d 按下 页面右移")
			s.SheetDataStartPointX -= 10
			s.UpdateSheetCellCur()
		}
	})
	s.EventRegister("Rune[a]", func() {
		s.LogInfo("a 按下")
		if s.PageCur == PageSheetData {
			s.LogInfo("a 按下 页面左移")
			s.SheetDataStartPointX += 10
			if s.SheetDataStartPointX > 0 {
				s.SheetDataStartPointX = 0
			}
			s.UpdateSheetCellCur()
		}
	})
	s.EventRegister("Rune[s]", func() {
		s.LogInfo("s 按下")
		if s.PageCur == PageSheetData {
			s.LogInfo("s 按下 页面下移")
			if len(s.SheetData)+s.SheetDataStartPointY < s.ScreenHeight {
				s.LogWarn("页面下移超出范围")
			} else {
				s.SheetDataStartPointY -= 10
			}
			s.UpdateSheetCellCur()
			s.UpdateSheetDataLineNumberWidth()
		}
	})
	s.EventRegister("Rune[w]", func() {
		s.LogInfo("w 按下")
		if s.PageCur == PageSheetData {
			s.LogInfo("w 按下 页面上移")
			s.SheetDataStartPointY += 10
			if s.SheetDataStartPointY > 0 {
				s.SheetDataStartPointY = 0
			}
			s.UpdateSheetCellCur()
			s.UpdateSheetDataLineNumberWidth()
		}
	})
	s.EventRegister("Rune[p]", func() {
		s.LogInfo("p 按下")
		s.PageCur = PageStyleShow
		s.ShowStyle()
	})
	s.EventRegister("PgDn", func() {
		s.LogInfo("PgDn 按下")
		if s.PageCur == PageSheetData {
			s.LogInfo("PgDn 按下 页面下移一页")
			if len(s.SheetData)+s.SheetDataStartPointY < s.ScreenHeight {
				s.LogWarn("页面下移超出范围")
			} else {
				s.SheetDataStartPointY -= s.ScreenHeight
			}
			s.UpdateSheetCellCur()
			s.UpdateSheetDataLineNumberWidth()
		}
	})
	s.EventRegister("PgUp", func() {
		s.LogInfo("PgUp 按下")
		if s.PageCur == PageSheetData {
			s.LogInfo("PgUp 按下 页面上移一页")
			s.SheetDataStartPointY += s.ScreenHeight
			if s.SheetDataStartPointY > 0 {
				s.SheetDataStartPointY = 0
			}
			s.UpdateSheetCellCur()
			s.UpdateSheetDataLineNumberWidth()
		}
	})
	s.ShowSheetChoice()
	s.ShowSheetData()
	return s
}
